Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

21. Merge Two Sorted Lists。

$
0
0

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.


给两条链表让给融合起来,给定的链表是排序过得,所以融合之后的也是排序的。我的思路就是用三个指针,其中两个指针(p1、p2)分别指向两条指针,另一个指针(tail)用来标记新融合的链表的最后一个节点。然后从第一个结点开始比较,如果p1(第一个链表)比p2(第二个链表)的数值小就让tail指向p1,反之则指向p2。然后当一条链表遍历完的时候,剩下另一条链表全部直接加到新链表中即可。这样就可以在不用创建新的节点情况下融合完两条链表。

#include <iostream>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode* p1 = l1;//用来指向l1
        ListNode* p2 = l2;//用来指向l2
        ListNode* tail;//用来表示当前最后一个节点
        int flag;//用来标记第一个数值谁大谁小,用来最后确定返回值。
        if(!p1) {//如果l1为空,直接返回l2
            return p2;
        } else if(!p2) {//l2为空,返回l1
            return p1;
        } else {
            if(p1->val<=p2->val) {//比较第一个节点的大小。
                tail = p1;
                p1 = p1->next;
                flag = 1;
            } else {
                tail = p2;
                p2 = p2->next;
                flag = 2;
            }

            while(p1 && p2) {
                if(p1->val <= p2->val) {//如果p1的数比p2的小,让tail指向p1,并且继续遍历。
                    tail->next = p1;
                    tail = p1;
                    p1 = p1->next;
                } else {//如果p2比p1的数小,tail指向这里
                    tail->next = p2;
                    tail = p2;
                    p2 = p2->next;
                }
            }

            if(!p1) {//如果此时p1指向空了,直接将p2剩下的内容连接到节点上.
                tail->next = p2;
            } else if(!p2) {
                tail->next = p1;
            }
        }
        if(flag == 1) {
            return l1;
        } else {
            return l2;
        }

    }
};

int main() {
    Solution s;


    ListNode node1(1);
    ListNode node2(1);

    ListNode node3(2);
    ListNode node4(3);

    node1.next = &node2;

    node3.next = &node4;

    ListNode * p = s.mergeTwoLists(&node1,&node3);

    while(p) {
        cout << p->val;
        p = p->next;
    }

}

作者:Leafage_M 发表于2017/9/19 23:10:43 原文链接
阅读:41 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>