Leetcode c语言- Merge Two Sorted Lists
2017-09-18 13:45
309 查看
Title:
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.
这道题给定两个从小到大排列好的链表,然后合并为一个,要求新链表也是从小到大排列。
第一种思路是先选定一个链表l1,然后遍历链表l2,看l2的每一个节点与l1中节点的关系,然后插入该节点即可。解法如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* p=l1;
struct ListNode* q=l2;
struct ListNode* temp;
struct ListNode* result;
if(l1==NULL)
return l2;
if (l2==NULL)
return l1;
if (l1->val<=l2->val) {
while (l2) {
printf("%d\n",l2->val);
if (p->next==NULL) {
p->next=q;
return l1;
}
else if (q->val<= p->next->val) {
l2->next=p->next;
p->next=l2;
p=p->next;
l2=l2->next;
q=q->next;
}
else if (l2->val > p->next->val) {
p=p->next;
}
}
return l1;
}
else {
while (l1) {
if (q->next==NULL) {
q->next=p;
return l2;
}
else if ( l1->val<= q->next->val) {
temp=q->next;
q->next=l1;
q->next->next=temp;
q=q->next;
l1=l1->next;
}
else if (l1->val > q->next->val) {
q=q->next;
}
}
return l2;
}
}
这种解法存在一个致命的缺陷,要从l2中把一个节点插入l1中,无法做到:
l2->next=p->next;
p->next=l2;
一般将一个单独的节点插入一个链表的做法就是如上两行代码。但是对于一个链表中的一个节点插入到另一个链表中,方法失效。因为后续操作中,要遍历l2,就要将l2=l2->next,但这个时候l2->next=p->next,这个时候就会陷入一个死循环。
因此这道题的正确结题思路是新建一个新的链表,然后首先判断l1和l2的第一个节点大小,如果l1大,将新建的链表temp指向l1的第一个节点:
temp=l1;
然后判断l1和l2的节点大小,小的那方将节点插入temp,然后+1前进一个节点,直到两个链表中有一个率先到达最后,这个时候再将链表temp指向另一个链表的剩余部分,完成合并。
solution:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* temp;
struct ListNode* result;
if(l1==NULL)
return l2;
if (l2==NULL)
return l1;
if (l1->val<=l2->val) {
temp=l1;
l1=l1->next;
}
else {
temp=l2;
l2=l2->next;
}
result=temp;
while(l1 && l2) {
if (l1->val<=l2->val) {
temp->next=l1;
l1=l1->next;
}
else {
temp->next=l2;
l2=l2->next;
}
temp=temp->next;
}
if(l1) {
temp->next=l1;
}
else if(l2){
temp->next=l2;
}
return result;
}
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.
这道题给定两个从小到大排列好的链表,然后合并为一个,要求新链表也是从小到大排列。
第一种思路是先选定一个链表l1,然后遍历链表l2,看l2的每一个节点与l1中节点的关系,然后插入该节点即可。解法如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* p=l1;
struct ListNode* q=l2;
struct ListNode* temp;
struct ListNode* result;
if(l1==NULL)
return l2;
if (l2==NULL)
return l1;
if (l1->val<=l2->val) {
while (l2) {
printf("%d\n",l2->val);
if (p->next==NULL) {
p->next=q;
return l1;
}
else if (q->val<= p->next->val) {
l2->next=p->next;
p->next=l2;
p=p->next;
l2=l2->next;
q=q->next;
}
else if (l2->val > p->next->val) {
p=p->next;
}
}
return l1;
}
else {
while (l1) {
if (q->next==NULL) {
q->next=p;
return l2;
}
else if ( l1->val<= q->next->val) {
temp=q->next;
q->next=l1;
q->next->next=temp;
q=q->next;
l1=l1->next;
}
else if (l1->val > q->next->val) {
q=q->next;
}
}
return l2;
}
}
这种解法存在一个致命的缺陷,要从l2中把一个节点插入l1中,无法做到:
l2->next=p->next;
p->next=l2;
一般将一个单独的节点插入一个链表的做法就是如上两行代码。但是对于一个链表中的一个节点插入到另一个链表中,方法失效。因为后续操作中,要遍历l2,就要将l2=l2->next,但这个时候l2->next=p->next,这个时候就会陷入一个死循环。
因此这道题的正确结题思路是新建一个新的链表,然后首先判断l1和l2的第一个节点大小,如果l1大,将新建的链表temp指向l1的第一个节点:
temp=l1;
然后判断l1和l2的节点大小,小的那方将节点插入temp,然后+1前进一个节点,直到两个链表中有一个率先到达最后,这个时候再将链表temp指向另一个链表的剩余部分,完成合并。
solution:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
struct ListNode* temp;
struct ListNode* result;
if(l1==NULL)
return l2;
if (l2==NULL)
return l1;
if (l1->val<=l2->val) {
temp=l1;
l1=l1->next;
}
else {
temp=l2;
l2=l2->next;
}
result=temp;
while(l1 && l2) {
if (l1->val<=l2->val) {
temp->next=l1;
l1=l1->next;
}
else {
temp->next=l2;
l2=l2->next;
}
temp=temp->next;
}
if(l1) {
temp->next=l1;
}
else if(l2){
temp->next=l2;
}
return result;
}
相关文章推荐
- 21. Merge Two Sorted Lists
- [LeetCode 21]Merge Two Sorted Lists 合并两个有序链表
- LeetCode OJ - Merge Two Sorted Lists
- Merge Two Sorted Lists
- C实现 LeetCode->Merge Two Sorted Lists (双指针大法)(单链表swap合并反转)
- leetcode 021 Merge Two Sorted Lists
- [Leetcode]-Merge Two Sorted Lists
- LeetCode - Merge Two Sorted Lists
- LeetCode 【21. Merge Two Sorted Lists】
- LeetCode OJ:Merge Two Sorted Lists
- 28-Merge Two Sorted Lists
- Merge Two Sorted Lists
- LeetCode 第 21 题 (Merge Two Sorted Lists)
- Merge Two Sorted Lists
- LeetCode || Merge Two Sorted Lists
- [Leetcode] Merge Two Sorted Lists
- LeetCode: Merge Two Sorted Lists
- Merge Two Sorted Lists
- Leetcode: Merge Two Sorted Lists
- Merge Two Sorted Lists