链表合并算法

来源:互联网 发布:centos 6.7 破解密码 编辑:程序博客网 时间:2024/04/30 20:57

题目

已知两个有序链表,试合并这两个链表,使得合并后的链表仍然有序(注:这两个链表没有公共结点,即不交叉)。

分析

既然两个链表都是有序的,所以合并它们跟合并两个有序数组没有多少区别,只是链表操作涉及到指针,不能大意。

方法一:非递归方法

使用2个指针list1和list2分别遍历两个链表,将较小值结点归并到结果链表中。如果有一个链表归并结束后另一个链表还有结点,则把另一个链表剩下部分加入到结果链表的尾部。代码如下所示:
struct node *sorted_merge(struct node *a, struct node *b) {    struct node result; //使用一个结点用于保存结果    struct node *tail = &result;     if (a == NULL)  return b; //特殊情况处理    else if (b == NULL) return a;    while (a && b) {        if (a->data <= b->data) { //a链表结点值小,加入到链表尾部,并更新tail,遍历a链表下一个结点            tail->next = a;            tail = a;            a = a->next;        } else {     //b链表结点值小,加入到链表尾部,更新tail,遍历b链表下一个结点            tail->next = b;            tail = b;            b = b->next;        }    }    if (a)  //a结点未遍历完,则加入到尾部        tail->next = a;    if (b)  //b结点未遍历完,加入到尾部        tail->next = b;    return result.next;}

方法二:递归算法
struct node* sorted_merge_recur(struct node* a, struct node* b){    struct node* result = NULL;    //基础情况    if (a==NULL) return(b);    else if (b==NULL) return(a);    // 递归遍历    if (a->data <= b->data) {        result = a;        result->next = sorted_merge_recur(a->next, b);    }    else {        result = b;        result->next = sorted_merge_recur(a, b->next);    }    return(result);}