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 原文链接
阅读:14 评论:0 查看评论