LeetCode: Add to List 148. Sort List

来源:互联网 发布:js 滑块控件 编辑:程序博客网 时间:2024/06/06 03:28
#include <stdio.h>
#include <stdlib.h>
 struct ListNode {
      int val;
      struct ListNode *next;
 };
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) 
{
    struct ListNode *head;
    struct ListNode *cur1;
    struct ListNode *cur2;
    struct ListNode *pre;
    struct ListNode *next;
    if(l1 == NULL || l2 == NULL)
        return l1 == NULL ? l2 : l1;
    head = l1->val < l2->val ? l1 : l2;
    cur1 = head == l1 ? l1 : l2;
    cur2 = head == l1 ? l2 : l1;
    while(cur1 != NULL && cur2 != NULL){
        if(cur1->val <= cur2->val){
            pre = cur1;
            cur1 = cur1->next;
        }else{
            next = cur2->next;
            pre->next = cur2;
            cur2->next = cur1;
            pre = cur2;
            cur2 = next;
        }
    }
    pre->next = cur1 == NULL ? cur2 : cur1;
    return head;
}
struct ListNode *mergeSort(struct ListNode* head)
{
    struct ListNode *head1;
    struct ListNode *head2;
    struct ListNode *walker;
    struct ListNode *runner;
    if(head == NULL || head->next == NULL){
        return head;
    }
    head1 = walker = runner = head;
while(runner->next != NULL && runner->next->next != NULL){
        walker = walker->next;
        runner = runner->next->next;
    }
head2 = walker->next;
walker->next = NULL;
    head1 = mergeSort(head1);
    head2 = mergeSort(head2);
    return(mergeTwoLists(head1, head2));
}
struct ListNode* sortList(struct ListNode* head)
{
    return(mergeSort(head));
}
int main()
{
struct ListNode head;
struct ListNode p, *result;
head.val = 2;
p.val = 1;
head.next = &p;
p.next = NULL;
result = sortList(&head);
}