自己做链表的题很容易弄错,感觉对链表太不熟悉了。需要加强对链表的练习。
这种链表题有时感觉思路很简单,但是在写代码的过程中会发现处理起来要十分的细心。
下面代码记录两种实现方法(都是别人实现的方法)。
第一种方法(代码里注释掉的部分):不满足题目要求
创建一个map,记录出现的数字及其出现的次数,然后遍历map赋值给链表。
第二种方法:原文链接
1、设置快慢指针分割链表,递归;
2、对分割后的链表进行排序,合并两个链表。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *dummy=new ListNode (0), *p=dummy;
while(l1 && l2){
if(l1->val >= l2->val){
p->next=l2;
l2=l2->next;
}
else{
p->next=l1;
l1=l1->next;
}
p=p->next;
}
if(l1) p->next=l1;
if(l2) p->next=l2;
return dummy->next;
}
ListNode* sortList(ListNode* head) {
if(!head || !head->next) return head;
ListNode *fast=head, *slow=head, *pre=head;
while(fast && fast->next){
pre=slow;
slow=slow->next;
fast=fast->next->next;
}
pre->next=NULL;
head=sortList(head);
slow=sortList(slow);
return mergeTwoLists(head,slow);
/**
map<int, int> nums;
ListNode* p = head;
while (p) {
nums[p->val]++;
p = p->next;
}
p = head;
map<int, int>::iterator iter = nums.begin();
while (iter != nums.end()) {
for (int i = 0; i < iter->second; ++i) {
p->val = iter->first;
p = p->next;
}
iter++;
}
return head;
**/
}
};