為了解決本道題有多種解法。
方法 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...