zoukankan      html  css  js  c++  java
  • 02线性结构1 两个有序链表序列的合并

      题目要求实现一个函数,将两个链表表示的递增整数序列合并为一个非递减的整数序列。

      这道题较为基础,主要考察C语言中链表的基本操作。只要会“连接”链表,考虑清楚比较过程和前后关系不难想出思路,关键是对链表的操作要清晰明确。

    typedef struct Node *PtrToNode;
    struct Node {
        ElementType Data; /* 存储结点数据 */
        PtrToNode   Next; /* 指向下一个结点的指针 */
    };
    typedef PtrToNode List; /* 定义单链表类型 */
    List Merge( List L1, List L2 )
    {
        List L, p, p1, p2;
        L = (List)malloc(sizeof(struct Node));
        p = L;
        p1 = L1->Next;
        p2 = L2->Next;
        while( p1 && p2 ){
            if( p1->Data <= p2->Data ){
                p->Next = p1;
                p1 = p1->Next;
            }else{
                p->Next = p2;
                p2 = p2->Next;
            }
            p = p->Next;
        }
        if (p1) {
            p->Next = p1;
        }else if (p2){
            p->Next = p2;
        }
        L1->Next = NULL;
        L2->Next = NULL;
        return L;
    }

      这里是我初次学会使用临时指针px(x指空或1或2,下同),后面很多涉及链表操作的题目都有类似的操作。本题而言,先需要创造一个空链表L作为最后返回的结果值,之后定义三个临时指针p、p1、p2分别指向L及传入的待操作链表L1、L2。这样做的好处是,无论之后怎么对Lx中的某个或多个结点怎么操作,都只需要用p进行。Lx还是指向这个链表的头,必要时能及时找到这个位置。

      准备工作做好后开始进行连接,整体思路是:p1和p2所指位置都有元素时进行大小比较并连接,其中一个为空后直接将p1/2连在p的末尾上;最后将L1和L2的Next域都指向空即可(题意要求如此)。之所以是让其Next指向空,是因为前面创造Lx时是有头结点的,且该头结点数据域本就为空,所以真正含有相关数值的第一个结点是原本的(Lx->Next)这个指针指向的结点。

      画出链表示意图对链表结构和其相关操作的理解有很大的帮助。

      

  • 相关阅读:
    hdu 1823 Luck and Love 二维线段树
    UVA 12299 RMQ with Shifts 线段树
    HDU 4578 Transformation 线段树
    FZU 2105 Digits Count 线段树
    UVA 1513 Movie collection 树状数组
    UVA 1292 Strategic game 树形DP
    【ACM】hdu_zs2_1003_Problem C_201308031012
    qsort快速排序
    【ACM】nyoj_7_街区最短路径问题_201308051737
    【ACM】nyoj_540_奇怪的排序_201308050951
  • 原文地址:https://www.cnblogs.com/biankun/p/8570101.html
Copyright © 2011-2022 走看看