• 【Leetcode】【Easy】Merge Two Sorted Lists


    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

    解题:

    普通做法三步:

    1、常规边界判定

    2、由于最终要返回合成的链表头部,因此需要先比较l1和l2首个结点值大小,确定ret值;

    3、新建一个cur指针操作要返回的链表,串起l1和l2;

    记录:

    1、指针赋值的关注点在等号的右边。指针名是变量名,随着赋值操作随时改变,不会产生连带影响;

     1 /**
     2  * Definition for singly-linked list.
     3  * struct ListNode {
     4  *     int val;
     5  *     ListNode *next;
     6  *     ListNode(int x) : val(x), next(NULL) {}
     7  * };
     8  */
     9 class Solution {
    10 public:
    11     ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
    12         ListNode *ret = NULL;
    13         ListNode *cur = NULL;
    14         
    15         if (!l1) return l2;
    16         if (!l2) return l1;
    17             
    18         if (l1->val <= l2->val) {
    19             ret = l1;
    20             l1 = l1->next;
    21         } else { 
    22             ret = l2;
    23             l2 = l2->next;
    24         }
    25         
    26         cur = ret;
    27         while (l1 && l2) {
    28             if (l1->val <= l2->val) {
    29                 cur->next = l1;
    30                 l1 = l1->next;
    31             } else {
    32                 cur->next = l2;
    33                 l2 = l2->next;
    34             }
    35             cur = cur->next;
    36         }
    37         
    38         if (!l1) 
    39             cur->next = l2;
    40         else 
    41             cur->next = l1;
    42         
    43         return ret;
    44     }
    45 };

    文艺做法:

    使用二重指针解决了判定链表头大小的步骤

    类似另一道简单题Remove Nth Node From End of List

    Linus once said " People who understand pointers just use a“pointer to the entry pointer”"

     1 class Solution {
     2 public:
     3     ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
     4         ListNode* head = NULL, **t = &head;
     5         while(l1 != NULL && l2 != NULL) {
     6             if(l1->val < l2->val) {
     7                 *t = l1;
     8                 l1 = l1->next;
     9             } else {
    10                 *t = l2;
    11                 l2 = l2->next;
    12             }
    13             t = &((*t)->next);
    14         }
    15         *t = (l1 != NULL ? l1 : l2);
    16         return head;
    17     }
    18 };
  • 相关阅读:
    p1229
    2017.01.21
    P1136 超车 归并排序 求逆序对个数
    2017年寒假计划
    递归一题总结(OJ P1117倒牛奶)
    原来scanf读入字符串还能这样..
    2016NOIP总结
    公式推♂倒题
    kmp+DP x 子串相关的计数问题
    XXXXXXXX不会太多吧?
  • 原文地址:https://www.cnblogs.com/huxiao-tee/p/4227397.html
Copyright © 2020-2023  润新知