`
qiemengdao
  • 浏览: 272717 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

链表合并算法

 
阅读更多

题目

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

分析

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

方法一:非递归方法

使用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);
}



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics