您的位置:首页 > 其它

LeetCode | Merge Two Sorted Lists

2016-08-12 16:05 477 查看
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、链表插入排序

从l1中选取出第一个可以插入数据的位置,将l2的数据依次插入。

这样的复杂度貌似是O(m*n)?

思路2、新开一个链表,选择排序

新开一个root,每次选取l1或者l2的第一个元素,复杂度O(m+n)。

注意如果两个链表不一样长,最后的部分是不需要再次排序的,因为已经有序并且next指针都没问题。

思路3、递归

递归的思路想起来有点别扭,一般也很少网这个方向想,其思路也是类似思路2的排序,只不过变成了递归操作。

不过不知道为什么这三种跑出来的用时都是一样的,beat 9.75%

class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {

// ListNode root(-1);
// root.next=l1;

// //遍历这个l2链表
// while(l2){
//     ListNode* l2next=l2->next;
//     //遍历整个链表
//     ListNode* cur=&root;
//     for(;cur->next;cur=cur->next){
//         if(cur->next->val>l2->val) break;
//     }

//     //更改链表指向
//     l2->next=cur->next;
//     cur->next=l2;

//     l2=l2next;
// }

// return root.next;

// //应当有O(N)的做法
// ListNode root(-1);
// ListNode* cur=&root;
// for(;l1 && l2;){
//     if(l1->val < l2->val){
//         cur->next=l1;
//         cur=l1;
//         l1=l1->next;
//     }
//     else{
//         cur->next=l2;
//         cur=l2;
//         l2=l2->next;
//     }
// }
// cur->next=l1?l1:l2;
// //以下实际上是不需要的,因为链表内部的节点顺序已经排好了
// // while(l1){
// //     cur->next=l1;
// //     cur=l1;
// //     l1=l1->next;
// // }
// // while(l2){
// //     cur->next=l2;
// //     cur=l2;
// //     l2=l2->next;
// // }

// return root.next;

//尝试写一个递归的
if(!l1 || !l2)
return l1?l1:l2;

if(l1->val < l2->val){
l1->next=mergeTwoLists(l1->next,l2);
return l1;
}
l2->next=mergeTwoLists(l1,l2->next);
return l2;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: