線性時間查詢兩個單鏈表的交叉結點

2021-06-28 21:16:24 字數 1844 閱讀 9205

為了解決本道題有多種解法。

方法 1)先將兩個單鏈表la和lb分別遍歷一遍,獲得各自的長度為m和n,假設m比n大,那麼先對la表從頭遍歷m-n個元素。接下來兩個表同時遍歷,若兩個指標指向同乙個結點,則停止。返回指向該結點的任一指標。

方法 2)先將兩個單鏈表la和lb分別遍歷一遍,分別將各自的指標儲存在兩個棧中。然後同時對兩個棧進行top操作,直到兩個棧頂元素相等,也就是兩個棧頂指標所指向的結點相同,則停止。返回指向該結點的任一指標。

本文實現的是方法1)。見以下**中的getinternode函式。merge函式是乙個輔助函式,為了構造兩個尾部結點相同的單鏈表。

#include 

#include

#include

#include

#include

using

namespace

std;

typedef

int type;

struct node

;void createlist(node * & phead, const

vector

& inp)

}void destroylist(node * & phead)

delete phead;

}void mergenode(node *ha, node *hb)

while( headb != null )

int lena=chain1.size(), lenb=chain2.size();

int len = 0;

node * record = null;

assert ( chain1.top()->data == chain2.top()->data );

while( !chain1.empty() && !chain2.empty() && chain1.top()->data == chain2.top()->data )

heada = ha;

headb = hb;

int rca = 0, rcb = 0;

while( heada && rca < lena )

while( headb && rcb < lenb-1 )

destroylist( headb->next );

headb->next = heada;

}node * getinternode(node *heada, node *headb)

while( hb )

int sub = rca>rcb ? (rca-rcb) : (rcb-rca);

ha = heada;

hb = headb;

int rc = 0;

while( rca>rcb && ha && rcnext;

}while( rcanext;

}while( ha && hb && ha != hb )

if (ha)

else

}int main()

; int arr2 = ;

vector

inp1(arr1, arr1+6);

vector

inp2(arr2, arr2+5);

node * l1 = null;

node * l2 = null;

createlist(l1, inp1);

createlist(l2, inp2);

mergenode(l1, l2);

node * ret = getinternode(l1, l2);

cout

<<"cross node: "

0;}

單鏈表操作之合併兩個單鏈表

本篇部落格為合併兩個單鏈表,有序和無序都可以 其中用到單鏈表的尾插和單鏈表的選擇排序 中大部分操作都在單鏈表基本操作詳解中介紹過,這裡就直接上 include include includetypedef int datatype typedef struct linknode linknode,p...

合併兩個有序單鏈表

include using namespace std typedef struct nodenode,linklist void creatlist linklist l void insert int n,node p void show linklist l cout num head2 ne...

合併兩個有序單鏈表

思路 第一種 遞迴法 這個方法不好想,遞過去的時候做的事情是找到新的單鏈表的下乙個節點,歸的時候做的是告訴每個節點的next是什麼繫結關係,帶入資料就能知道怎麼回事 public listnode merge listnode a,listnode b if b null listnode newh...